/*
 * tree.h
 *
 *  Created on: Nov 28, 2010
 *      Author: cumeo89
 */

#ifndef TREE_H_
#define TREE_H_

#include "node.h"

/**
 * Cây hậu tố
 */
typedef struct {

	const gchar **strings;

	Node *root;

} SuffixTree;

/**
 * Kiểu con trỏ hàm để theo dõi quá trình dựng cây hậu tố.
 * @see t_new_callback()
 */
typedef void (*TreeConstructionCallback) (SuffixTree *currentTree, gpointer userData, glong i, glong j);

/**
 * Con trỏ hàm rỗng, khi được gọi nó sẽ không làm gì cả.
 */
void nullCallback(SuffixTree *currentTree, gpointer userData, glong i, glong j);

/**
 * Dựng cây hậu tố tổng quát từ mảng các chuỗi mã hoá bằng UTF-8. Mảng này cần được kết
 * thúc bằng con trỏ NULL nếu không hàm sẽ đọc những chuỗi không xác định trong
 * bộ nhớ.
 * @return cây hậu tố tổng quát
 * @see t_new_callback()
 */
SuffixTree *t_new(const gchar **utf8String);

/**
 * Giống như hàm t_new nhưng cho phép người sử dụng theo dõi quá trình dựng cây thông
 * qua hàm callback. Trong khi dựng cây, mỗi khi có sự thay đổi nhất định hàm
 * <code>callback</code> sẽ được gọi với dữ liệu <code>userData</code>.
 * @see t_new()
 */
SuffixTree *t_new_callback(const gchar **utf8String, TreeConstructionCallback callback, gpointer userData);

/**
 * Giải phóng bộ nhớ chiếm dụng bởi cây và tất cả các nút con của nó.
 */
void t_free(SuffixTree *tree);

#endif /* TREE_H_ */
